package com.cykj.order.service;

import com.cykj.order.domain.vo.CartInfoVo;
import com.cykj.order.domain.dto.AddCartItemDto;
import com.cykj.order.domain.dto.CartItemOperationDto;

import java.util.List;

/**
 * 购物车Service接口
 * 
 * @author cykj
 * @date 2025-01-20
 */
public interface ICartService {
    
    /**
     * 初始化购物车
     * 根据用户ID和店铺ID查询购物车，如果不存在则创建新的购物车
     * 
     * @param customerId 用户ID
     * @param businessId 店铺ID
     * @return 购物车信息（包含购物车ID和商品明细）
     */
    CartInfoVo initializeCart(Integer customerId, Integer businessId);
    
    /**
     * 添加商品到购物车
     * 注意：此方法用于将新商品添加到购物车，数量固定为1
     * 
     * @param addCartItemDto 添加购物车商品参数
     * @return 购物车信息（包含购物车ID和商品明细）
     * 
     * 业务场景：用户浏览商品列表，点击"加入购物车"按钮
     * 注意：只有未加入购物车的商品才显示此按钮
     */
    CartInfoVo addCartItem(AddCartItemDto addCartItemDto);
    
    /**
     * 购物车商品操作（增加、减少、删除）
     * 注意：此方法仅用于操作购物车中已存在的商品
     * 
     * @param operationDto 操作参数
     * @return 购物车信息（包含购物车ID和商品明细）
     * 
     * 操作类型说明：
     * - ADD: 增加1个商品
     * - REDUCE: 减少1个商品
     * - DELETE: 删除商品
     * 
     * 业务场景：用户在购物车页面操作商品数量
     */
    CartInfoVo operateCartItem(CartItemOperationDto operationDto);
    
    /**
     * 清空购物车
     * 删除购物车中的所有商品，但保留购物车本身
     * 
     * @param cartId 购物车ID
     * @return 购物车信息（包含购物车ID，商品明细为空）
     * 
     * 业务场景：用户点击"清空购物车"按钮
     */
    CartInfoVo clearCart(Integer cartId);


    /**
     * 根据用户ID获取所有购物车（按商家分组）
     *
     * @param customerId 用户ID
     * @return 购物车列表（每个商家一个购物车）
     */
    List<CartInfoVo> getAllCartsByUserId(Integer customerId);
}
